<script setup>
import {ArrowUpBold} from "@element-plus/icons-vue";
// getCurrentInstance（获取当前组件实例）
import {ref,onMounted,getCurrentInstance,onUnmounted} from 'vue'

// 使用getCurrentInstance获取当前组件实例，并解构出proxy对象。proxy相当于Vue2中的this，用于在组合式API中访问组件上下文。
const { proxy } = getCurrentInstance()

// 该组件是回到顶部的按钮

const props = defineProps({
  // 距离屏幕底部的像素值
  bottom: {
    type: Number,
    default: 155,
  },
  // 距离屏幕右侧的像素值
  right: {
    type: Number,
    default: 30,
  },
  // 按钮背景颜色
  bgColor: {
    type: String,
    default: '#b6aaf9',
  }
})

// 控制按钮的显示和隐藏
const showButton = ref(false)
onMounted(() => {
  // 调用checkScroll检查滚动位置，决定是否显示按钮。
  checkScroll()
  // 添加窗口resize事件监听，当窗口大小改变时调用checkScroll
  window.addEventListener('resize',checkScroll)
  // 添加父容器的scroll事件监听，当父容器滚动时调用checkScroll。
  proxy.$el.parentElement.addEventListener('scroll',checkScroll)
})

// 在组件卸载时移除事件监听
onUnmounted(() => {
  window.removeEventListener('resize',checkScroll)
  proxy.$el.parentElement.removeEventListener('scroll',checkScroll)
})

// 当点击按钮时，调用此方法。
const scrollToTop = () => {
  // 获取父容器（即组件的父元素，该元素必须有滚动条）。
  const container = proxy.$el.parentElement
  // 使用scrollTo方法平滑滚动到父容器的顶部（top: 0），behavior: 'smooth'表示平滑滚动。
  container.scrollTo({
    top: 0,
    behavior: 'smooth'
  })
}

//  检查滚动位置方法
const checkScroll = () => {
  // 获取父容器（即组件的父元素，该元素必须有滚动条）。
  const container = proxy.$el.parentElement
  // 如果父容器的滚动位置大于50像素，则显示按钮（showButton.value = true），否则隐藏。
  showButton.value = container.scrollTop > 50
}

</script>

<template>
  <button v-if="showButton" @click="scrollToTop" class="scroll-to-top" :style="{bottom: bottom + 'px',right: right + 'px',backgroundColor: bgColor}">
    <el-icon><ArrowUpBold/></el-icon>
  </button>
</template>

<style scoped lang="stylus">
.scroll-to-top {
  position: fixed;
  color: white;
  border: none;
  border-radius: 50%;
  cursor: pointer;
  outline: none;
  transition: opacity 0.3s;
  width 30px
  height 30px
  display flex
  justify-content center
  align-items center
  font-size 18px

  &:hover {
    opacity: 0.6;
  }
}
</style>